/* 
   Термометр с LCD дисплеем, использующий
   температурный датчик LM75 шины I2C от
   National Semiconductor
   
   CodeVisionAVR C Compiler
   (C) 2000-2002 HP InfoTech S.R.L.
   www.hpinfotech.ro
   
   Чип: AT90S8515
   Модель Памяти: SMALL
   Размер Стека Данных: 128 байт
*/

// Для шины I2C используются биты ПОРТА A
// ПРИМЕЧАНИЕ: ДЛЯ СИГНАЛОВ SDA и SCL ШИНЫ I2C
// ДОЛЖНЫ БЫТЬ ИСПОЛЬЗОВАНЫ РЕЗИСТОРЫ 3.3k..4.7k
// ПОДТЯНУТЫЕ К +5V 

#asm
   .equ __i2c_port=0x1b ;ПОРТ A
   .equ __scl_bit=0 ;SCL=STK500 РАЗЪЕМ PORTA вывод 1
   .equ __sda_bit=1 ;SDA=STK500 РАЗЪЕМ PORTA вывод 2
#endasm

#include <lm75.h>   // программы управления LM75
#include <stdio.h>  // функция sprintf
#include <delay.h>  // функция delay_ms

/*
   Используется алфавитно-цифровой LCD 2x16, подключенный
   к разъему PORTC STK500 следующим образом:
   
   [LCD]   [РАЗЪЕМ PORTC STK500]
    1 GND - 9  GND
    2 +5V - 10 VCC
    3 VLC - управление контрастностью LCD напряжение 0..1V
    4 RS  - 1  PC0
    5 RD  - 2  PC1
    6 EN  - 3  PC2
   11 D4  - 5  PC4
   12 D5  - 6  PC5
   13 D6  - 7  PC6
   14 D7  - 8  PC7
*/

#asm
   .equ __lcd_port=0x15
#endasm

#include <lcd.h> // программы управления LCD

// буфер LCD дисплея
char lcd_buffer[33];

void main(void)
{
   char sign;
   int temp;
   // инициализируем LCD
   lcd_init(16);
   // инициализируем шину I2C
   i2c_init();
   // инициализируем LM75 чип с адресом 0
   // гистерезис температуры 20°C
   // O.S. температура 25°C
   // O.S. выход активный - высокий уровень
   lm75_init(0,20,25,1);
   // цикл отображения температуры
   while (1)
   {
      // читаем температуру LM75 *10°C
      // из чипа с адресом 0
      temp=lm75_temperature_10(0);
      sign='+';
      if (temp<0)
         {
         sign='-';
         temp=-temp;
         };
      sprintf(lcd_buffer,"t=%c%i.%u\xdfC",sign,temp/10,temp%10);
      // отобразим температуру
      lcd_clear();
      lcd_puts(lcd_buffer);
      delay_ms(200);
   }
}
